xcb 获取事件
获取窗口事件
1// 获取窗口事件
2#include <stdio.h>
3#include <xcb/xcb.h>
4
5int main()
6{
7 // 连接到X11 Server
8 xcb_connection_t* conn = xcb_connect(NULL, NULL);
9
10 // 获取screen
11 const xcb_setup_t* setup = xcb_get_setup(conn);
12 xcb_screen_iterator_t iter = xcb_setup_roots_iterator(setup);
13 xcb_screen_t* screen = iter.data;
14
15 // 创建窗口
16 xcb_window_t window = xcb_generate_id(conn);
17 uint32_t mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK;
18 uint32_t values[2];
19 values[0] = screen->white_pixel;
20 values[1] = XCB_EVENT_MASK_KEY_PRESS | XCB_EVENT_MASK_KEY_RELEASE;
21
22 xcb_create_window(conn, XCB_COPY_FROM_PARENT, window, screen->root,
23 0, 0, 500, 500, 10, XCB_WINDOW_CLASS_INPUT_OUTPUT,
24 screen->root_visual, mask, values);
25
26 xcb_map_window(conn, window);
27 xcb_flush(conn);
28
29 // 读取事件
30 xcb_generic_event_t* event;
31 while((event = xcb_wait_for_event(conn))) {
32 if(event->response_type == XCB_KEY_PRESS)
33 {
34 xcb_key_press_event_t *press = (xcb_key_press_event_t*)event;
35 printf("press %d\n", press->detail);
36 }
37
38 if(event->response_type == XCB_KEY_RELEASE)
39 {
40 xcb_key_press_event_t *press = (xcb_key_press_event_t*)event;
41 printf("release %d\n", press->detail);
42 }
43 }
44
45 xcb_disconnect(conn);
46}
获取全局事件
1// 获取全局事件
2#include <stdio.h>
3#include <xcb/xcb.h>
4
5
6#define ModMaskAlt XCB_MOD_MASK_1
7#define ModMaskNumLock XCB_MOD_MASK_2
8#define ModMaskSuper XCB_MOD_MASK_4
9#define ModMaskModeSwitch XCB_MOD_MASK_5
10#define ModMaskShift XCB_MOD_MASK_SHIFT
11#define ModMaskCapsLock XCB_MOD_MASK_LOCK
12#define ModMaskControl XCB_MOD_MASK_CONTROL
13
14int main()
15{
16 // 连接到X11 Server
17 xcb_connection_t* conn = xcb_connect(NULL, NULL);
18
19 // 获取screen
20 const xcb_setup_t* setup = xcb_get_setup(conn);
21 xcb_screen_iterator_t iter = xcb_setup_roots_iterator(setup);
22 xcb_screen_t* screen = iter.data;
23
24 // 捕获快捷键
25 xcb_grab_key(conn, 1, screen->root,
26 ModMaskControl, 46, // Ctrl + L
27 XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC);
28 xcb_grab_key(conn, 1, screen->root,
29 ModMaskControl | ModMaskCapsLock, 46, // Ctrl + L with CapsLock
30 XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC);
31 xcb_grab_key(conn, 1, screen->root,
32 ModMaskControl | ModMaskNumLock, 46, // Ctrl + L with NumLock
33 XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC);
34 xcb_grab_key(conn, 1, screen->root,
35 ModMaskControl | ModMaskCapsLock | ModMaskNumLock, 46, // Ctrl + L with CapsLock and NumLock
36 XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC);
37 xcb_flush(conn);
38
39 // 读取事件
40 xcb_generic_event_t* event;
41 while((event = xcb_wait_for_event(conn))) {
42 if(event->response_type == XCB_KEY_PRESS)
43 {
44 xcb_key_press_event_t *press = (xcb_key_press_event_t*)event;
45 printf("press %d\n", press->detail);
46 }
47
48 if(event->response_type == XCB_KEY_RELEASE)
49 {
50 xcb_key_press_event_t *press = (xcb_key_press_event_t*)event;
51 printf("release %d\n", press->detail);
52 }
53 }
54
55 xcb_disconnect(conn);
56}